Hack du fichier utf8.php, module StoreCommander sur Prestashop chez Hostinger
15/01/2020Cela commence par une histoire plutôt classique de migration d'une boutique Prestashop et se termine par employer une veille technique de hack pour contourner la sécurité sur les fichiers PHP suspectés comme dangereux chez l'hébergeur Hostinger.
J'ai découvert à la suite d'une migration que cet hébergeur "analyse" les fichiers sources PHP que l'on dépose et se donne le droit (certainement pour des raisons de sécurité) de les supprimer. Certes cela prend une ligne à écrire mais j'ai passé beaucoup de temps avant de comprendre que quelques soit la méthode employée pour déposer/envoyer des fichiers, en quelques secondes, l'hébergeur peut les supprimer.
Dans mon cas, j'ai un seul fichier incriminé : modules/storecommande/XXXX/SC/lib/php/utf8.php
Seul problème, j'ai vraiment besoin de ce fichier car il fait partie du code de lancement du module StoreCommander. Après une rapide analyse de ce très long fichier de plus de 500ko qui est un condensé de code HTML/Javacript/PHP utilisant toutes les techniques les plus dégueulasses d'obfuscation de code, j'en conclus que je vais pas réussir à m'en sortir en tentant de nettoyer le code.
De plus, je sais que ce module utilise l'extension ionCube permettant de "protéger" du code PHP, je pense qu'il y a une partie du code obfusqué qui est un payload à charger pour cette extension, un beau bordel.
Puis me viens l'idée toute bête d'encapsuler le fichier dans un zip, qui sera décompressé et exécuté à la volée par l'interpréteur PHP.
Plusieurs remarques :
- Ce fichier est appelé par l'inclusion dans le fichier d'initialisation modules/storecommande/XXXX/SC/init_sc.php, j'utilise donc la variable
SC_DIR
pour déterminer le bon chemin du zip. - On passe par un flux plutôt que par un fichier et l'on décode le flux dans une variable.
- Enfin on utilise la fonction PHP eval() préfixé du délimiteur
?>
pour terminer le script en cours car le fichier utf8.php contenu dans la variablecontent
commence par le délimiteur de script PHP. - Attention à bien terminer la fin du fichier juste après le
;
de la fonctioneval()
et à veiller à ce qu'il n'y ait pas de caractères après (espace et saut de ligne compris).
Pour terminer, on modifie le lanceur pour intégrer notre nouveau fichier en lieu et place de l'ancienne inclusion.
Et voilà, le module fonctionne!